//============================================================================================
/**
 * @file	poke_clact_move.c
 * @brief	ポケモンアクター動作
 * @author	Nozomu Saito
 */
//============================================================================================

#include "poke_clact_move.h"

//--------------------------------------------------------------------------------------------
/**
 * ポケモンの向きをセット
 *
 * @param	poke_ptr	ポケモンセルアクターポインタ
 * @param	nDir		方向
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PokeClActMv_SetDir(PCLACT_PTR poke_ptr, const POKE_DIR inDir)
{
	CLACT_WORK_PTR clact_ptr;
	u8 anm_idx;
	u8 now_num;

	if (inDir == POKE_DIR_NONE){
		//方向指定なし
		return;
	}

	clact_ptr = PCLACT_GetClActWorkPtr(poke_ptr);
	//現在のアニメナンバーを取得
	now_num = CLACT_AnmGet( clact_ptr );
	if (now_num == inDir-1){
		//アニメが同じなので処理は行わない
		return;
	}

	switch(inDir){
	case POKE_DIR_UP:
		anm_idx = 0; break;
	case POKE_DIR_DOWN:
		anm_idx = 1; break;
	case POKE_DIR_LEFT:
		anm_idx = 2; break;
	case POKE_DIR_RIGHT:
		anm_idx = 3; break;
	default:
		GF_ASSERT(0);
		return;
	}
	//アニメ変更
	CLACT_AnmChg( clact_ptr, anm_idx );
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモン位置をセット
 *
 * @param	poke_ptr	ポケモンセルアクターポインタ
 * @param	inX			X座標
 * @param	inY			Y座標
 * @param	nDir		方向
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PokeClActMv_SetPos(PCLACT_PTR poke_ptr, const int inX, const int inY, const POKE_DIR inDir)
{
	VecFx32 vec = {0,0,0};
	CLACT_WORK_PTR clact_ptr;
	clact_ptr = PCLACT_GetClActWorkPtr(poke_ptr);
	PokeClActMv_SetDir(poke_ptr, inDir);

	vec.x = FX32_ONE*inX;
	vec.y = FX32_ONE*inY;

	CLACT_SetMatrix(clact_ptr, &vec);
}

//--------------------------------------------------------------------------------------------
/**
 * 位置を取得
 *
 * @param	poke_ptr	ポケモンセルアクターポインタ
 * @param	outX			X座標
 * @param	outY			Y座標
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PokeClActMv_GetPos(PCLACT_PTR poke_ptr, int *outX, int *outY)
{
	const VecFx32 *vec;
	CLACT_WORK_PTR clact_ptr = PCLACT_GetClActWorkPtr(poke_ptr);
	vec = CLACT_GetMatrix(clact_ptr);
	*outX = vec->x / FX32_ONE;
	*outY = vec->y / FX32_ONE;
}

//--------------------------------------------------------------------------------------------
/**
 * ポケモンを移動
 *
 * @param	poke_ptr	ポケモンセルアクターポインタ
 * @param	inX			X座標
 * @param	inY			Y座標
 * @param	nDir		方向
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
void PokeClActMv_Move(PCLACT_PTR poke_ptr, const int inX, const int inY, const POKE_DIR inDir)
{
	const VecFx32 *now_vec;
	VecFx32 vec = {0,0,0};
	CLACT_WORK_PTR clact_ptr;

	vec.x = FX32_ONE * inX;
	vec.y = FX32_ONE * inY;
	vec.z = 0;
	clact_ptr = PCLACT_GetClActWorkPtr(poke_ptr);
	PokeClActMv_SetDir(poke_ptr, inDir);
	now_vec = CLACT_GetMatrix(clact_ptr);
	VEC_Add( &vec, now_vec, &vec );

	CLACT_SetMatrix(clact_ptr, &vec);
}
